import { ClientAction, ClientInfo, Message } from "../shared/api_bot/IMassage";
import sdk from "../core";
import { ClientManage } from "../core";
import { BaseMessage } from "../shared/api_bot/base";

interface _MsgMessage extends BaseMessage {
    action: ClientAction;
    info?: any;
    data?: any;
}

/**
 * 客户端服务
 * 负责处理客户端连接和消息发送的业务逻辑
 */
export class ClientService {
    
    /**
     * 验证客户端信息
     * @param clientInfo 客户端信息
     * @returns 验证结果
     */
    static validateClientInfo(clientInfo: ClientInfo | null): boolean {
        return clientInfo !== null && clientInfo !== undefined;
    }
    
    /**
     * 验证消息信息
     * @param message 消息信息
     * @returns 验证结果
     */
    static validateMessage(message: Message | null): boolean {
        return message !== null && message !== undefined;
    }
    
    /**
     * 发送消息到客户端
     * @param clientInfo 客户端信息
     * @param message 消息内容
     * @param action 操作类型
     * @param data 数据内容
     * @param info 附加信息
     * @returns 发送结果
     */
    static sendMessage(
        clientInfo: ClientInfo | null,
        message: Message | null,
        action: ClientAction,
        data: any,
        info?: any
    ): boolean {
        if (!this.validateClientInfo(clientInfo)) {
            console.log('没有clientInfo');
            return false;
        }
        
        if (!this.validateMessage(message)) {
            console.log('没有消息');
            return false;
        }
        
        const msgObj = {
            action,
            Message: message!,
            info,
            data
        };
        
        try {
            ClientManage.sendMsg(clientInfo!, msgObj);
            return true;
        } catch (error) {
            console.error('发送消息失败:', error);
            return false;
        }
    }
    
    /**
     * 发送文本消息
     * @param clientInfo 客户端信息
     * @param message 消息内容
     * @param text 文本内容
     * @returns 发送结果
     */
    static sendTextMessage(
        clientInfo: ClientInfo | null,
        message: Message | null,
        text: string
    ): boolean {
        if (!this.validateClientInfo(clientInfo)) {
            console.log(`[无连接]\n${text}\n----------`);
            return false;
        }
        
        return this.sendMessage(clientInfo, message, ClientAction.text, text);
    }
    
    /**
     * 发送图片消息
     * @param clientInfo 客户端信息
     * @param message 消息内容
     * @param imageName 图片名称
     * @param imageData 图片数据
     * @returns 发送结果
     */
    static sendImageMessage(
        clientInfo: ClientInfo | null,
        message: Message | null,
        imageName: string,
        imageData: any
    ): boolean {
        return this.sendMessage(
            clientInfo,
            message,
            ClientAction.image,
            imageData,
            { render: imageName }
        );
    }
    
    /**
     * 更新客户端活跃时间
     * @returns 当前时间戳
     */
    static updateActiveTime(): number {
        return Date.now();
    }
    
    /**
     * 检查客户端是否活跃
     * @param lastActiveTime 上次活跃时间
     * @param timeout 超时时间（毫秒）
     * @returns 是否活跃
     */
    static isClientActive(lastActiveTime: number, timeout: number = 300000): boolean {
        return Date.now() - lastActiveTime < timeout;
    }
    
    /**
     * 获取客户端状态信息
     * @param clientInfo 客户端信息
     * @param message 消息信息
     * @param lastActiveTime 上次活跃时间
     * @returns 状态信息
     */
    static getClientStatus(
        clientInfo: ClientInfo | null,
        message: Message | null,
        lastActiveTime: number
    ): {
        isConnected: boolean;
        hasMessage: boolean;
        isActive: boolean;
        lastActiveTime: number;
    } {
        return {
            isConnected: this.validateClientInfo(clientInfo),
            hasMessage: this.validateMessage(message),
            isActive: this.isClientActive(lastActiveTime),
            lastActiveTime
        };
    }
    
    /**
     * 格式化消息内容
     * @param msg 消息对象
     * @returns 格式化后的消息
     */
    static formatMessage(msg: _MsgMessage): _MsgMessage {
        return {
            ...msg,
            action: msg.action,
            info: msg.info || {},
            data: msg.data || ''
        };
    }
} 